{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color=\"#8c8c8c\">基础作业</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color=\"#8c8c8c\">1. 引入依赖</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "#设置tf日志级别为info\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color=\"#8c8c8c\">2. 读取mnist数据</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ../data/train-images-idx3-ubyte.gz\n",
      "Extracting ../data/train-labels-idx1-ubyte.gz\n",
      "Extracting ../data/t10k-images-idx3-ubyte.gz\n",
      "Extracting ../data/t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"../data/\")\n",
    "#获取训练集图片和标签\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "#获取验证集图片和标签\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "#获取测试集图片和标签\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(784,)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist.train.images[0].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <font color=\"#8c8c8c\">3. 画出训练集中的16张图和标签</font>\n",
    "#### <font color=\"#8c8c8c\">每张图对应的矩阵有784个像素值，这里可以把它转变为28x28的二维矩阵</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")\n",
    "\n",
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### <font color='#8c8c8c'>计算交叉熵损失</font>\n",
    "#### <font color='#8c8c8c'>实例化一个优化函数（梯度下降优化器），基于一定的学习率进行梯度优化训练，以此求出最小损失</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### <font color='#8c8c8c'>用softmax激活函数去激活第二层隐层的前馈计算值（tf.nn.softmax）</font>\n",
    "#### <font color='#8c8c8c'>和ground truth比对，最后计算准确度</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#使用softmax激活函数进行激活\n",
    "pred = tf.nn.softmax(logits)\n",
    "# tf.argmax(pred, 1)在激活后的矩阵中，找出每行内最大值的索引，并和y中的每个对应元素比较\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "# tf.cast(correct_pred, tf.float32)将correct_pred的元素格式转换成float32\n",
    "# tf.reduce_mean(tf.cast(correct_pred, tf.float32))计算均值，即精确度\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.424797, the validation accuracy is 0.8746\n",
      "after 200 training steps, the loss is 0.289519, the validation accuracy is 0.906\n",
      "after 300 training steps, the loss is 0.194141, the validation accuracy is 0.9232\n",
      "after 400 training steps, the loss is 0.354538, the validation accuracy is 0.9248\n",
      "after 500 training steps, the loss is 0.232317, the validation accuracy is 0.9372\n",
      "after 600 training steps, the loss is 0.238518, the validation accuracy is 0.939\n",
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.220295, the validation accuracy is 0.9462\n",
      "after 800 training steps, the loss is 0.746846, the validation accuracy is 0.9338\n",
      "after 900 training steps, the loss is 0.275385, the validation accuracy is 0.9518\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9371\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    # tf.global_variables_initializer()初始化全局变量Op\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "    #训练1000次\n",
    "    for i in range(trainig_step):\n",
    "        #从训练数据中提取batch_size个数据\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        # feed_dict给模型提供数据\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './basic_results/model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用训练的模型做一个测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./basic_results\\model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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qLLP+phpc3b4T+3p9OQaJ60sXyawu8n41n063ROHHObF9x7c2klbeqTfZfzHwOe9eFKu+9Sts7+8LK7fbv+af5Xsp+8Ni5nv4dlHeXGzGbNi5qOibRrV1P2gqx+e38Uf0vl+v/2dbKv38V/yocf7+85umW638pyd/t0lXQMvcwCAD455yotvPvASP+HnmcVXPGQ8EyYiIgoJG2EiIqKQsBEmIiIKSYUeEy5Yl+NM37u6pxef1XaKk/Z907ZenOw3a2S0auFM/7j324Ep/zhn288NIr7JMeFU2368P/40Zb/gi8DTnXzzdjby4vz5f6a6WpVW3t8rvbj6+yudtA7v+/Gxl/VELB0Q3y0oaXv5t60Eb1cCgPvWdPPiVtf615JEPCyNSqDJxwud6fm37vDiwfVne/HNH7rX58S6feyMP49zprdd49+SevKIcU7aBbWWePGf1/j73LY/F1PpcoBnwkRERCFhI0xERBSSit0dvWmTM/3lMr/76Ye933LSVnxS20974aAS/1ZOF7fLJLu134V14B6L3HrFeM6OlO7BP5SAbQ38budMSY+Z76ap//DiPVH+b2ug4i2+01/ekV2eX97vv2Q+e0kF6LOsACKH+S4d7D957tX/PurFHTJruF8MvIyh3Zf+7UWdrprrZCvY4ndpP/jtQCftopP8oaaH9vXHNV7u4XZpF8wou1tV48UzYSIiopCwESYiIgoJG2EiIqKQVOgx4Uh17/YfY9n3rn86aR90G+7FD93pvlQ6HlNy3fHE/MDxy75VdkTkFkTT8qlfnWm+oSX1ck/Kifp58DGVAND85fjesETl15pL3Ws9Zh74jBcvytvmpFVbHbnNUrJlv+c/qvICXO/F6053t73tG7K8uPNg//bA/C1bEEvHW2Y704e396/p+KrrKC++8073PLPZP1Du8EyYiIgoJGyEiYiIQrJbdUdjkt/dW/tYN+mcftd4cU77LJRU/Zdid2Eve7+rMz31gOFR80XeUkXJl96hrTM9Zb83gqleNGZzNydf5tfu236o4tk6YHPMtFOnX+xMNxr7S6qrQwHBruns92Lni/eNZZH70o0fBLbnwO74ob1GOfmebdrPi5P95MTS4pkwERFRSNgIExERhWT36o4uQvo4v/up/rjklr1tUU33gwOi59PeezvT8uP05FaEsLJ/I2c61lOynh47wJluj4lR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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./basic_results')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color=\"#8c8c8c\">对模型结构的理解</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### <font color='#8c8c8c'>该模型对应的神经网络，共四层，其中有两个隐层、即输入、输出层：</font>\n",
    "\n",
    "#### <font color='#8c8c8c'>输入层</font>\n",
    "有784个维度\n",
    "\n",
    "#### <font color='#8c8c8c'>隐层1</font>\n",
    "有100个神经元\n",
    "使用Relu激活函数\n",
    "#### <font color='#8c8c8c'>隐层2</font>\n",
    "有10个神经元\n",
    "\n",
    "#### <font color='#8c8c8c'>输出层</font>\n",
    "使用softmax激活函数作为最后输出，输出层节点个数取决于分类数目\n",
    "\n",
    "综上，识别手写数字其实是一个分类任务：\n",
    "神经网络结构为：全连接神经网络（含两个隐层）+ softmax  \n",
    "具体结构与下图类似：\n",
    "![title](../pics/nnstrut1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color=\"#8c8c8c\">对模型训练过程（梯度如何计算，参数如何更新）的理解</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "该训练模型选取了mnist.train的32张图的数据，训练1000次  \n",
    "\n",
    "在反向传播计算过程中，\n",
    "将最后输出y与ground truth对比差异，计算交叉熵损失，基于一定的学习率通过梯度下降更新每一层的权重值，最后将损失最小时的模型作为预测模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color=\"#8c8c8c\">对计算图的理解</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tensorflow 是一个通过计算图的形式来表述计算的编程系统，计算图也叫数据流图，可以把计算图看做是一种有向图，Tensorflow 中的每一个计算都是计算图上的一个节点，而节点之间的边描述了计算之间的依赖关系。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "tensorflow程序执行计算图一般分为两个阶段：  \n",
    "\n",
    "\n",
    "　　1、定义计算图所有的计算  \n",
    "\n",
    "　　2、在session中执行计算  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "TensorFlow 的每一个计算都是图上的一个节点，节点之间的边描述了节点之间的依赖关系。下面看下图片： \n",
    "![title](../pics/flow.png)  \n",
    "上图中， 每个节点对应者每一次的计算，这张图就是整个执行计算图过程中的第一步，构建graph  \n",
    "\n",
    "                                                 relu = tf.nn.relu(tf.matmul(w, x) + b)  \n",
    "                                                 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在第一步中，定义的计算不会执行，只有在会话阶段真正执行。  \n",
    "                                                     sess = tf.Session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "two_node = tf.constant(2)\n",
    "three_node = tf.constant(3)\n",
    "sum_node = two_node + three_node\n",
    "sess = tf.Session()\n",
    "print(sess.run(sum_node))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "会话的作用是处理内存分配和优化，使我们能够实际执行由图形指定的计算。\n",
    "可以将计算图想象为我们想要执行的计算的“模板”：它列出了所有的步骤。\n",
    "为了使用这个图表，我们还需要发起一个会话，它使我们能够实际地完成任务。\n",
    "例如，遍历模板的所有节点来分配一组用于存储计算输出的存储器。\n",
    "为了使用 Tensorflow 进行各种计算，我们既需要图也需要会话。\n",
    "\n",
    "会话包含一个指向全局图的指针，该指针通过指向所有节点的指针不断更新。\n",
    "这意味着在创建节点之前还是之后创建会话都无所谓。\n",
    "创建会话对象后，可以使用 sess.run(node) 返回节点的值，并且 Tensorflow 将执行确定该值所需的所有计算。\n",
    "一般来说，sess.run() 调用往往是最大的 TensorFlow 瓶颈之一，所以调用它的次数越少越好。\n",
    "可以的话在一个 sess.run() 调用中返回多个项目，而不是进行多个调用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 为什么要使用with tf.Session() as sess: ？\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一个Session可能会拥有一些资源，例如Variable或者Queue。  \n",
    "当我们不再需要该session的时候，需要将这些资源进行释放。有两种方式：  \n",
    "\n",
    "1. 调用session.close()方法；  \n",
    "2. 使用with tf.Session()创建上下文（Context）来执行，当上下文退出时自动释  \n",
    "\n",
    "为了写代码时，不会因漏写session.close()方法而导致不再利用的资源占据过多内存空间，第二种方法比较流行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    " \n",
    "# Build a graph.\n",
    "a = tf.constant([1.0, 2.0])\n",
    "b = tf.constant([3.0, 4.0])\n",
    "c = a * b\n",
    " \n",
    "# Launch the graph in a session.\n",
    "sess = tf.Session()\n",
    " \n",
    "# Evaluate the tensor 'c'.\n",
    "print sess.run(c)\n",
    "sess.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    " \n",
    "# Build a graph.\n",
    "a = tf.constant([1.0, 2.0])\n",
    "b = tf.constant([3.0, 4.0])\n",
    "c = a * b\n",
    " \n",
    "with tf.Session() as sess:\n",
    "    print sess.run(c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color=\"#8c8c8c\">解释这⾥的模型为什么效果⽐较差</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "原因可能有如下几点：  \n",
    "1. 学习率太小，训练次数不够，导致还没找到最优解，就迭代完了；  \n",
    "2. 学习率是恒定的，导致错过了最优解；\n",
    "3. 有比梯度下降更优的更新权值的方法（比如MomentumSGD,NesterovMomentum,Adam等）\n",
    "3. 没有使用更加高效的激活函数\n",
    "4. 神经网络的结构不够优化（隐层数和神经元数）\n",
    "5. 损失函数没有加正则, 导致模型过拟合或者欠拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
